package com.yuzou.十月马蹄杯;

import java.util.Arrays;
import java.util.Scanner;

public class 竹鼠通讯 {
    static class Point {
        double x, y;
        Point(double x, double y) {
            this.x = x;
            this.y = y;
        }
    }
    //定义常量
    static final int N = 200050;//数组的最大容量
    static final double INF = 1e9;
    static Point[] q = new Point[N];//存储所有点的二维数组；
    static int[] temp = new int[N];//临时数组，存储中间节点的索引；
    static int n;//存储节点的总数；
    //计算两个节点之间的距离；
    static double getDist(Point a, Point b){
        double dx = a.x - b.x;
        double dy = a.y - b.y;
        return Math.sqrt(dx * dx + dy * dy);
    }
    //比较器,按照x的升序进行排序
    static int cmp1(Point a, Point b){
        if(a.x == b.x){
            //根据y的升序进行排序
            return Double.compare(a.y, b.y);
        }
        return Double.compare(a.x, b.x);
    }
    //比较器,按照y的升序进行排序
    static int cmp2(Integer a, Integer b){
        return Double.compare(q[a].y, q[b].y);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();//点的数量；
        //遍历每个点的坐标并存储；
        for (int i = 0; i < n; i++) {
            double x = scanner.nextDouble();
            double y = scanner.nextDouble();
            q[i] = new Point(x, y);
        }
        //特殊情况处理，如果点的数量小于2，直接返回0.0000
        if(n < 2){
            System.out.printf("%.4f", 0.0000);
            return;
        }
        //对所有点按照x的升序进行排序
        Arrays.sort(q, 0, n,(a, b) -> cmp1(a, b));
        double mind = solve(0, n - 1);
        System.out.printf("%.4f", mind);
        scanner.close();

    }
    //分治法解决[l,r]区间最近点的 距离问题
    private static double solve(int l, int r){
        if(l == r){
            return INF;
        }
        if(l + 1 == r){
            return getDist(q[l], q[r]);//区间内只有两个点；
        }
        //分治算法
        int mid = (l + r) / 2;
        double d1 = solve(l, mid);
        double d2 = solve(mid + 1, r);
        double d = Math.min(d1, d2);
        //收集中间区域的点：x坐标与中间点x的差值不超过当前最小距离mind的点；
        int k = 0;//记录符合条件的点的数量；
        for (int i = l; i <= r; i++) {
            if(Math.abs(q[mid].x - q[i].x) < d){
                temp[k++] = i;
            }
        }

        //将临时数组中的点按y坐标升序排序（便于后续高效比较）
        // 由于Java的Arrays.sort对int数组排序需要包装类，这里转换为Integer数组
        Integer[] tmpInteger = new Integer[k];
        for (int i = 0; i < k; i++) {
            tmpInteger[i] = temp[i];  // 复制索引值
        }
        // 使用cmp2比较器按y坐标排序
        Arrays.sort(tmpInteger, (a, b) -> cmp2(a, b));

        // 检查中间区域的点对，更新最小距离
        for (int i = 0; i < k; i++) {  // 遍历每个点
            // 只比较当前点之后的点，且y坐标差值小于当前最小距离（超过则无需比较）
            for (int j = i + 1; j < k && q[tmpInteger[j]].y - q[tmpInteger[i]].y < d; j++) {
                // 计算两点距离，更新最小距离
                d = Math.min(d, getDist(q[tmpInteger[i]], q[tmpInteger[j]]));
            }
        }

        return d;  // 返回当前区间的最小距离
    }


}
